<?php
/**
 * CK 快速开发框架
 * User: Clake
 * Date: 15/6/2
 * Time: 00:55
 */

namespace CK\Core;


use CK\Util\Error;

class App extends Base{
    /**
     * WEB运行模式
     */
    const MODE_WEB = 1;

    /**
     * CLI运行模式
     */
    const MODE_CLI = 2;
    /**
     * RPC运行模式
     */
    const MODE_RPC = 3;

    //当前运行模式
    public static $_current_mode;

    /**
     * 当前初始化的实例
     * @var \CK\Core\App
     */
    private static $_instance;

    /**
     * 路由类
     * @var \CK\Core\Router
     */
    protected $_router;

    /**
     * 模块类
     * @var \CK\Core\Module
     */
    protected $_module;

    /**
     * 自动加载器
     * @var \CK\Core\Loader
     */
    protected $_loader;

    /**
     * 初始化当前类实例
     * @param int $mode 运行模式常量
     *
     * @throws \Exception
     * @return App
     */
    public static function inst($mode=self::MODE_WEB) {
        if (!isset(self::$_instance)) {
            switch ($mode) {
                case self::MODE_WEB:
                    self::$_instance = new \CK\Mode\Web\App();
                    break;
                case self::MODE_CLI:
                    self::$_instance = new \CK\Mode\Cli\App();
                    break;
                case self::MODE_RPC:
                    self::$_instance = new \CK\Mode\Rpc\App();
                    break;
                default:
                    throw new \Exception('Not this runtime mode!');
            }
        }
        self::$_current_mode = $mode;
        return self::$_instance;
    }

    /**
     * 构造初始化当前类
     */
    public function __construct() {
        if (CK_DEBUG) {
            ini_set('display_errors','On');
        } else {
            ini_set('display_errors','Off');
        }
        //注册应用自动加载
        $this->_loader = Loader::inst(Config::inst(CK_DEF_CONF)->get('autoload'));
        $this->_loader->register();
        //注册错误处理
        $this->register();
        //得到应用主配置文件
        $this->init();
    }

    /**
     * 设置当前APP使用的路由类
     * @param Router $router
     */
    public function setRouter(Router $router) {
        $this->_router = $router;
    }

    public function getRouter() {
        return $this->_router;
    }

    /**
     * 得到运行的模块类
     * @return Module
     */
    public function getModule() {
        return $this->_module;
    }

    /**
     * 初始化APP运行资源
     * 每个运行模式重写
     */
    protected function init() {}



    public function register() {
        Error::inst()->enable();
    }

    /**
     * 开始执行应用
     */
    public function start() {
        $this->_module->run();
    }
}